package annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**l'annotazione indica alla JVM che, dato un costruttore di una
 * classe, esso e' il costruttore che il mapeditor deve utilizzare
 * per costruire un oggetto caricato dal ClassLoader.
 * <p>ipotizziamo di voler costruire il Renderer "Bee.class". A meno che
 * tale classe abbia un costruttore vuoto, per costruire la classe Bee servirà che
 * qualcuno <strong>scelga un costruttore e i suoi parametri</strong>: questo
 * puo' essere fatto tramite il JConstructorDialog. Tuttavia cio' che il Dialog
 * non puo' sapere e' il significato dei parametri da inserire.
 * <p>Questa annotation descrive dunque il significato di un costruttore; per descrivere
 * un costruttore basterà annotare un'unica annotazione MainConstructor. Ora, siccome
 * le descrizioni {@link #descriptions()} e i {@link #types()} dei parametri sono in 2 array
 * diversi, servirà che ogni descrizione sia nello stesso posto nell'array del tipo del parametro a
 * cui si riferisce. 
 * <p>Infine, affinche' la finestra possa distinguere i vari parametri l'annotazione comprende:
 * <ul>
 *  <li>{@link #descriptions()}: la lista delle descrizioni dei parametri contenuti</li>
 *  <li>{@link #types()}: la lista dei tipi dei parametri contenuti nel costruttore</li>
 * </ul>
 * 
 * <p>la variabile {@link #types()} è tuttavia opzionale: questo perché già attraverso la classe Constructor è posisbile
 * ottenere il tipo di ciascun parametro richiesto dal costruttore. Invece {@link #descriptions()} è essenziale per capire
 * cosa rappresenta quel parametro! 
 * 
 * @author Koldar
 * @version 1.1
 *
 */
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.CONSTRUCTOR)
public @interface MainConstructor {

	/**indica una serie di stringa che indicano cosa rappresenta ciascun parametro passato nel costruttore*/
	public String[] descriptions();
	/**indica i tipi dei parametri richiesti nel costruttore. Dato il poco utilizzo (esiste già un metodo in java.reflect che fa ciò) di default è un array vuoto*/
	public ParameterType[] types() default {};
	
}
